package org.example.mybatis.domain;

import lombok.Data;

import java.io.Serializable;

/**
 * 统一响应结构
 *
 * @author LiQingZe
 */
@Data
public class Response<T> implements Serializable {

    // 响应状态码，默认为 200 表示成功
    private int code = 200;
    // 响应消息，默认为 "OK"
    private String message = "OK";
    // 响应数据
    private T data;

    // =================================== 成功响应 ===================================

    /**
     * 创建成功响应
     *
     * @param <T> 数据类型
     * @return 成功响应对象
     */
    public static <T> Response<T> success() {
        return new Response<>();
    }

    /**
     * 创建带数据的成功响应
     *
     * @param data 响应数据
     * @param <T>  数据类型
     * @return 成功响应对象
     */
    public static <T> Response<T> success(T data) {
        Response<T> response = new Response<>();
        response.setData(data);
        return response;
    }

    /**
     * 创建带消息和数据的成功响应
     *
     * @param message 响应消息
     * @param data    响应数据
     * @param <T>     数据类型
     * @return 成功响应对象
     */
    public static <T> Response<T> success(String message, T data) {
        Response<T> response = new Response<>();
        response.setMessage(message);
        response.setData(data);
        return response;
    }

    // =================================== 失败响应 ===================================

    /**
     * 创建失败响应，默认状态码500
     *
     * @param <T> 数据类型
     * @return 失败响应对象
     */
    public static <T> Response<T> fail() {
        Response<T> response = new Response<>();
        response.setCode(500);
        response.setMessage("系统错误");
        return response;
    }

    /**
     * 创建带错误消息的失败响应，默认状态码500
     *
     * @param errorMessage 错误消息
     * @param <T>          数据类型
     * @return 失败响应对象
     */
    public static <T> Response<T> fail(String errorMessage) {
        Response<T> response = new Response<>();
        response.setCode(500);
        response.setMessage(errorMessage);
        return response;
    }

    /**
     * 创建带状态码和错误消息的失败响应
     *
     * @param code         状态码
     * @param errorMessage 错误消息
     * @param <T>          数据类型
     * @return 失败响应对象
     */
    public static <T> Response<T> fail(int code, String errorMessage) {
        Response<T> response = new Response<>();
        response.setCode(code);
        response.setMessage(errorMessage);
        return response;
    }

}

